home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Environments
/
PowerMacOberon feb96
/
Source
/
ScrollBars.Mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1995-01-30
|
14KB
|
347 lines
Syntax10.Scn.Fnt
Syntax10b.Scn.Fnt
FoldElems
Syntax10.Scn.Fnt
lowerCol, upperCol : INTEGER;
BEGIN
IF pressed THEN
lowerCol := lightgrey;
upperCol := darkgrey;
INC(patX); DEC(patY)
ELSE
lowerCol := darkgrey;
upperCol := lightgrey
END;
Display.ReplConst(lowerCol, X, Y, W, 2, Display.replace);
Display.ReplConst(lowerCol, X+W-2, Y +2, 2, H-2, Display.replace);
Display.ReplConst(upperCol, X, Y+2, 2, H-2, Display.replace);
Display.ReplConst(upperCol, X+2, Y+H-2, W-4, 2, Display.replace);
Display.Dot(upperCol, X, Y+1, Display.replace);
Display.Dot(upperCol, X+W-2, Y+H-1, Display.replace);
Display.ReplConst(middlegrey, X+2, Y+2, W-4, H-4, Display.replace);
IF pat # 0 THEN
Display.CopyPattern(black, pat, X + patX, Y + patY, Display.paint)
END
END DrawButton;
Syntax10.Scn.Fnt
BEGIN
obj.downArrow := downArrow;
obj.upArrow := upArrow;
obj.backgroundCol := backgroundCol;
obj.downW := downPatW; obj.downH := downPatH;
obj.upW := upPatW; obj.upH := upPatH;
obj.downdX := 0; obj.downdY := 0;
obj.updX := 0; obj.updY := 0;
obj. x := 0; obj.y := 0; obj.w := 0; obj.h := 0;
obj.sliderdY := 0; obj.sliderH := 0;
obj.F := NIL
END Init;
Syntax10.Scn.Fnt
VAR h, minSliderH: INTEGER;
BEGIN
h := obj.h - 2*obj.w;
minSliderH := obj.minW + obj.minW DIV 2;
IF h <= minSliderH THEN
obj.sliderdY := 0; obj.sliderH := h
ELSIF length = 0 THEN obj.sliderdY := 0; obj.sliderH := h
ELSIF (beg = 0) & (length = end) THEN obj.sliderdY := 0; obj.sliderH := h
ELSE
obj.sliderH := SHORT(((h-minSliderH)*(end-beg)) DIV length);
IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
ELSIF obj.sliderH > h THEN obj.sliderH := h END;
obj.sliderdY := SHORT(((h-minSliderH)*beg) DIV length);
IF (beg > 0) & (obj.sliderdY = 0) THEN INC(obj.sliderdY) END;
IF length = end THEN obj.sliderdY := h - obj.sliderH
ELSIF obj.sliderdY + obj.sliderH >= h THEN
obj.sliderH := obj.sliderH - (obj.sliderdY - obj.sliderH) DIV 2;
IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
ELSIF obj.sliderH > h THEN obj.sliderH := h END;
obj.sliderdY := h - obj.sliderH;
IF obj.sliderdY > 1 THEN DEC(obj.sliderdY) END
END
END
END CalculateSliderDim;
Syntax10.Scn.Fnt
BEGIN
obj.minW := w;
obj.x := x; obj.y := y; obj.w := w; obj.h := h;
IF (obj.minW < obj.downW + 4) & (obj.downW >= obj.upW) THEN obj.minW := obj.downW + 4
ELSIF (obj.minW < obj.upW + 4) & (obj.upW >= obj.downW) THEN obj.minW := obj.upW + 4
END;
obj.downdX := (w - obj.downW) DIV 2;
obj.downdY := (w - obj.downH) DIV 2 ;
obj.updX := (w - obj.upW) DIV 2;
obj.updY := (w - obj.upH+1) DIV 2;
obj.sliderH := w + w DIV 2;
obj.sliderdY := 0;
END SetDim;
Syntax10.Scn.Fnt
BEGIN
END LineDown;
Syntax10.Scn.Fnt
BEGIN
END LineUp;
Syntax10.Scn.Fnt
BEGIN
END PageDown;
Syntax10.Scn.Fnt
BEGIN
END PageUp;
Syntax10.Scn.Fnt
VAR x, y, w, h, sdY, sH: INTEGER;
BEGIN
x := obj.x; y := obj.y + obj.w;
w := obj.w; h := obj.h - 2*w;
sdY := obj.sliderdY; sH := obj.sliderH;
IF obj.minW # w THEN
Display.ReplConst(backCol, x, y, w, h, Display.replace)
ELSIF (h < w + w DIV 2) THEN
Display.ReplConst(obj.backgroundCol, x, y, w, h, Display.replace)
ELSE
IF sdY > 0 THEN
Display.ReplConst(obj.backgroundCol, x, y+h-sdY, w, sdY, Display.replace)
END;
DrawButton(pressed, 0, 0, 0, x, y+h-sdY-sH, w, sH);
IF h - sdY - sH > 0 THEN
Display.ReplConst(obj.backgroundCol, x, y, w, h - sdY - sH, Display.replace)
END
END
END DrawSlider;
Syntax10.Scn.Fnt
BEGIN
obj.CalculateSliderDim(length, beg, end);
obj.DrawSlider(sliderPressed)
END Update;
Syntax10.Scn.Fnt
BEGIN
END UpdateView;
Syntax10.Scn.Fnt
VAR pat: Display.Pattern;
BEGIN
DrawButton(pressed, obj.downArrow, obj.downdX, obj.downdY, obj.x, obj.y, obj.w, obj.w)
END DrawDownButton;
Syntax10.Scn.Fnt
BEGIN
DrawButton(pressed, obj.upArrow, obj.updX, obj.updY, obj.x, obj.y+obj.h-obj.w, obj.w, obj.w)
END DrawUpButton;
Syntax10.Scn.Fnt
BEGIN
IF obj.h < obj.minW*2 THEN
Display.ReplConst(obj.backgroundCol, obj.x, obj.y, obj.w, obj.h, Display.replace)
ELSE
obj.DrawUpButton(FALSE);
obj.DrawSlider(FALSE);
obj.DrawDownButton(FALSE)
END
END Draw;
Syntax10.Scn.Fnt
VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
BEGIN
x := obj.x; y := obj.y; w := obj.w; h := w;
Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
pressed := FALSE;
suspendTime := Input.Time();
fast := FALSE;
REPEAT
IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my < y + h) THEN
pressed := TRUE;
obj.DrawDownButton(pressed)
ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
pressed := FALSE;
obj.DrawDownButton(pressed)
END;
IF pressed & (keysum # {}) THEN
time := Input.Time();
IF time >= suspendTime THEN
IF fast THEN suspendTime := time + lowDelay
ELSE fast := TRUE; suspendTime := time + middleDelay
END;
obj.LineUp
END
END;
Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
keysum := keysum + keys
UNTIL keys = {};
obj.DrawDownButton(FALSE)
END TrackDownButton;
Syntax10.Scn.Fnt
VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
BEGIN
x := obj.x; y := obj.y + obj.h - obj.w; w := obj.w; h := w;
Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
pressed := FALSE;
suspendTime := Input.Time();
fast := FALSE;
REPEAT
IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my < y + h) THEN
pressed := TRUE;
obj.DrawUpButton(pressed)
ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
pressed := FALSE;
obj.DrawUpButton(pressed)
END;
IF pressed & (keysum # {}) THEN
time := Input.Time();
IF time >= suspendTime THEN
IF fast THEN suspendTime := time + lowDelay
ELSE fast := TRUE; suspendTime := time + middleDelay
END;
obj.LineDown
END
END;
Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
keysum := keysum + keys
UNTIL keys = {};
obj.DrawUpButton(FALSE)
END TrackUpButton;
Syntax10.Scn.Fnt
VAR
keys: SET;
x, y, w, h, sH, sdY, dY, minH, myOld, myHelp, dYOld, delta: INTEGER;
BEGIN
x := obj.x; y := obj.y + obj.w; w := obj.w; h := obj.h - 2*obj.w;
sH := obj.sliderH; sdY := obj.sliderdY;
minH := obj.minW + obj.minW DIV 2;
dYOld := sdY; dY := sdY;
myOld := my; delta := 0;
Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
obj.DrawSlider(TRUE);
REPEAT
myHelp := my;
IF (keysum # {}) & (delta # 0) THEN
obj.UpdateView(TRUE,dY)
END;
Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
keysum := keysum + keys;
delta := myHelp - my;
dY := sdY + (myOld - my);
IF ((delta > 0 ) & (dY <= obj.sliderdY)) OR ((delta < 0) & (dY >= obj.sliderdY)) THEN delta := 0 END;
IF (delta > 0) & (h = obj.sliderdY + obj.sliderH) THEN
myOld := my; sdY := obj.sliderdY; delta := 0;
IF myOld < y THEN myOld := y END
ELSIF (delta < 0) & (obj.sliderdY = 0 ) THEN
myOld := my; sdY := 0; delta := 0;
IF myOld >= y + h THEN myOld := y + h - 1 END
END;
IF dY < 0 THEN dY := 0
ELSIF dY > h - minH THEN dY := h - minH
END;
UNTIL keys = {};
IF keysum # Cancel THEN
obj.DrawSlider(FALSE)
ELSE
obj.UpdateView(FALSE, dYOld)
END
END TrackSlider;
Syntax10.Scn.Fnt
VAR keys: SET; fast: BOOLEAN;
BEGIN
suspendTime := Input.Time();
IF my >= obj.y + obj.h -obj.w - obj.sliderdY THEN
Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
fast := FALSE;
REPEAT
IF (keysum # {}) & (my >= obj.y + obj.h -obj.w - obj.sliderdY) & (my < obj.y + obj.h -obj.w) THEN
time := Input.Time();
IF time >= suspendTime THEN
IF fast THEN suspendTime := time + middleDelay
ELSE fast := TRUE; suspendTime := time + highDelay
END;
obj.PageUp
END
END;
Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
keysum := keysum + keys
UNTIL keys = {};
ELSIF my >= obj.y + obj.h -obj.w -obj.sliderdY - obj.sliderH THEN
obj.TrackSlider(mx, my, keysum)
ELSE
Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
fast := FALSE;
REPEAT
IF (keysum # {}) & (my >= obj.y + obj.w) & (my < obj.y + obj.h -obj.w - obj.sliderdY - obj.sliderH) THEN
time := Input.Time();
IF time >= suspendTime THEN
IF fast THEN suspendTime := time + middleDelay
ELSE fast := TRUE; suspendTime := time + highDelay
END;
obj.PageDown
END
END;
Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
keysum := keysum + keys
UNTIL keys = {};
END
END TrackSliderBar;
Syntax10.Scn.Fnt
BEGIN
obj.F := F;
IF (keysum # {}) & (obj.w >= obj.minW) & (obj.h >= 2*obj.w) THEN
Oberon.RemoveMarks(obj.x, obj.y, obj.w, obj.h);
IF my < obj.y + obj.w THEN obj.TrackDownButton(mx, my, keysum)
ELSIF my >= obj.y + obj.h - obj.w THEN obj.TrackUpButton(mx, my, keysum)
ELSIF obj.h >= 2*obj.w + obj.sliderH THEN obj.TrackSliderBar(mx, my, keysum)
END;
END
END HandleScrollBar;
Syntax10.Scn.Fnt
highDelay := Input.TimeUnit DIV 2;
middleDelay := Input.TimeUnit DIV 3;
lowDelay := Input.TimeUnit DIV 18;
backgroundCol := middlegrey;
upArrowImage[0] := {}; downArrowImage[0] := {};
upArrowImage[1] := {2..4}; downArrowImage[7] := {2..4};
upArrowImage[2] := {2..4}; downArrowImage[6] := {2..4};
upArrowImage[3] := {2..4}; downArrowImage[5] := {2..4};
upArrowImage[4] := {0..6}; downArrowImage[4] := {0..6};
upArrowImage[5] := {1..5}; downArrowImage[3] := {1..5};
upArrowImage[6] := {2..4}; downArrowImage[2] := {2..4};
upArrowImage[7] := {3}; downArrowImage[1] := {3};
upArrow := Display.NewPattern(upArrowImage, 7, 7);
downArrow := Display.NewPattern(downArrowImage, 7, 7);
downPatW := 7; downPatH := 7;
upPatW := 7; upPatH := 7;
MODULE ScrollBars;
IMPORT Display, Input, Oberon;
CONST
MR = 0; MM = 1; ML = 2; Cancel = {ML, MM, MR};
black = 15; darkgrey = 14; middlegrey = 13; lightgrey = 12; white = 0;
patternCol = darkgrey; backCol = white;
ScrollBarElem* = POINTER TO ScrollBarElemDesc;
ScrollBarElemDesc* = RECORD
F*: Display.Frame;
x-, y-, w-, h-: INTEGER;
minW-, sliderdY-, sliderH-: INTEGER;
backgroundCol: INTEGER;
downArrow, upArrow: Display.Pattern;
downdX, downdY, updX, updY: INTEGER;;
downW, downH, upW, upH: INTEGER;
END;
backgroundCol: INTEGER;
downArrow, upArrow: Display.Pattern;
downArrowImage, upArrowImage, pat: ARRAY 9 OF SET;
downPatW, upPatW, downPatH, upPatH: INTEGER;
lowDelay, middleDelay, highDelay, suspendTime, time: LONGINT;
PROCEDURE DrawButton(pressed: BOOLEAN; pat: Display.Pattern; patX, patY, X, Y, W, H: INTEGER);
PROCEDURE (obj: ScrollBarElem) Init*;
PROCEDURE (obj: ScrollBarElem) CalculateSliderDim* (length, beg, end: LONGINT);
PROCEDURE (obj: ScrollBarElem) SetDim* (x, y, w, h: INTEGER);
PROCEDURE (obj: ScrollBarElem) LineDown*;
PROCEDURE (obj: ScrollBarElem) LineUp*;
PROCEDURE (obj: ScrollBarElem) PageDown*;
PROCEDURE (obj: ScrollBarElem) PageUp*;
PROCEDURE (obj: ScrollBarElem) DrawSlider* (pressed : BOOLEAN);
PROCEDURE (obj: ScrollBarElem) Update* (sliderPressed: BOOLEAN; length, beg, end: LONGINT);
PROCEDURE (obj: ScrollBarElem) UpdateView*(pressed: BOOLEAN; dY: INTEGER);
PROCEDURE (obj: ScrollBarElem) DrawDownButton* (pressed : BOOLEAN);
PROCEDURE (obj: ScrollBarElem) DrawUpButton* (pressed : BOOLEAN);
PROCEDURE (obj: ScrollBarElem) Draw*;
PROCEDURE (obj: ScrollBarElem) TrackDownButton* (VAR mx, my : INTEGER; VAR keysum : SET);
PROCEDURE (obj: ScrollBarElem) TrackUpButton* (VAR mx, my : INTEGER; VAR keysum : SET);
PROCEDURE (obj: ScrollBarElem) TrackSlider* (VAR mx, my : INTEGER; VAR keysum : SET);
PROCEDURE (obj: ScrollBarElem) TrackSliderBar*(VAR mx, my : INTEGER; VAR keysum : SET);
PROCEDURE (obj: ScrollBarElem) HandleScrollBar* (F: Display.Frame; mx, my : INTEGER;
keysum : SET);
BEGIN
END ScrollBars.